package br.com.bankai.koby.repository.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Repository;

import br.com.bankai.koby.repository.entity.PessoaJuridica;
import br.com.bankai.koby.repository.entity.simple.PessoaJuridicaSimple;
import br.com.graflogic.utilities.datautil.repository.BaseRepository;

/**
 * 
 * @author Leonardo
 *
 */
@Repository
public class PessoaJuridicaRepository extends BaseRepository<PessoaJuridica> {

	public PessoaJuridicaRepository() {
		super(PessoaJuridica.class);
	}

	public List<PessoaJuridicaSimple> search(PessoaJuridicaSimple entity) {
		CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
		CriteriaQuery<PessoaJuridicaSimple> query = builder.createQuery(PessoaJuridicaSimple.class);
		List<Predicate> predicateList = new ArrayList<Predicate>();

		Root<PessoaJuridicaSimple> pessoa = query.from(PessoaJuridicaSimple.class);

		if (StringUtils.isNotEmpty(entity.getCnpj())) {
			predicateList.add(builder.and(builder.like(pessoa.<String> get("cnpj"), "%" + entity.getCnpj() + "%")));
		}

		if (StringUtils.isNotEmpty(entity.getNome())) {
			predicateList.add(builder.and(builder.like(builder.upper(pessoa.<String> get("nome")), "%" + entity.getNome().toUpperCase() + "%")));
		}

		if (0 != entity.getStatus()) {
			predicateList.add(builder.and(builder.equal(pessoa.<String> get("status"), entity.getStatus())));
		}

		predicateList.add(builder.and(builder.equal(pessoa.get("tipo"), entity.getTipo())));

		query.orderBy(builder.asc(pessoa.get("nome")));
		query.where(predicateList.toArray(new Predicate[predicateList.size()]));
		TypedQuery<PessoaJuridicaSimple> typedQuery = getEntityManager().createQuery(query);

		return typedQuery.getResultList();
	}

	public PessoaJuridicaSimple find(PessoaJuridicaSimple entity) {
		CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
		CriteriaQuery<PessoaJuridicaSimple> query = builder.createQuery(PessoaJuridicaSimple.class);
		List<Predicate> predicateList = new ArrayList<Predicate>();

		Root<PessoaJuridicaSimple> pessoa = query.from(PessoaJuridicaSimple.class);

		if (null != entity.getId()) {
			predicateList.add(builder.and(builder.equal(pessoa.get("id"), entity.getId())));
		} else {
			predicateList.add(builder.and(builder.equal(pessoa.get("cnpj"), entity.getCnpj())));
		}

		predicateList.add(builder.and(builder.equal(pessoa.get("tipo"), entity.getTipo())));

		query.where(predicateList.toArray(new Predicate[predicateList.size()]));
		TypedQuery<PessoaJuridicaSimple> typedQuery = getEntityManager().createQuery(query);

		return typedQuery.getSingleResult();
	}

	public PessoaJuridica find(PessoaJuridica entity) {
		CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
		CriteriaQuery<PessoaJuridica> query = builder.createQuery(PessoaJuridica.class);
		List<Predicate> predicateList = new ArrayList<Predicate>();

		Root<PessoaJuridica> pessoa = query.from(PessoaJuridica.class);

		if (null != entity.getId()) {
			predicateList.add(builder.and(builder.equal(pessoa.get("id"), entity.getId())));
		} else {
			predicateList.add(builder.and(builder.equal(pessoa.get("cnpj"), entity.getCnpj())));
		}

		predicateList.add(builder.and(builder.equal(pessoa.get("tipo"), entity.getTipo())));

		query.where(predicateList.toArray(new Predicate[predicateList.size()]));
		TypedQuery<PessoaJuridica> typedQuery = getEntityManager().createQuery(query);

		return typedQuery.getSingleResult();
	}
}